#include "DisplayManager.h"
#include "DataModels.h"
#include <Arduino.h>

namespace DisplayManager
{

    EPD2_COLOR<EPD2_MODE, EPD2_MODE::HEIGHT> display(EPD2_MODE(/*CS=*/5, /*DC=*/17, /*RST=*/16, /*BUSY=*/19));
    U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;

    time_t lastRefreshTime = 0;

    void recordRefreshTime()
    {
        lastRefreshTime = time(nullptr);
    }

    void initDisplay()
    {
        display.init();
        display.setRotation(3);
        u8g2Fonts.begin(display);
        u8g2Fonts.setFontMode(1);
        u8g2Fonts.setFontDirection(0);

    }

    void sleep(bool deep)
{
    // 小心：调用 sleep() 前，请保证所有绘制操作已经完成（不要在 page loop 中调用）
    // 使用 powerOff() 可关闭驱动电压，适合进入 deep sleep 或长期待机
    // 如果传入 deep=true，则调用 hibernate()（深度睡眠模式，仅能由 RST 唤醒）
    if (deep) {
        // 深度睡眠模式（controller deep sleep），唤醒方式受限（通常只有 RST）
        display.hibernate();
    } else {
        // 常规断电，驱动电压关闭，下一次 init() 会重新加载波形
        display.powerOff();
    }

    // 给控制器时间稳定（可选）
    delay(50);
}

    int drawWrappedText(U8G2_FOR_ADAFRUIT_GFX &u8g2, int x, int y, String text, int maxChars, int lineHeight)
    {
        int start = 0, textLength = text.length(), currentY = y, lines = 0;
        while (start < textLength)
        {
            int len = min(maxChars, textLength - start);
            String line = text.substring(start, start + len);
            u8g2.setCursor(x, currentY);
            u8g2.print(line);
            currentY += lineHeight;
            start += len;
            lines++;
        }
        return lines;
    }

    // ---------------- 全屏刷新 ----------------
    void updateDisplayFull()
    {
        recordRefreshTime();
        display.init();
        display.setRotation(3);
        u8g2Fonts.begin(display);
        u8g2Fonts.setFontMode(1);
        u8g2Fonts.setFontDirection(0);
        display.setFullWindow();
        display.firstPage();
        do
        {
            u8g2Fonts.setBackgroundColor(GxEPD_WHITE);

            // 左侧日期
            int leftX = 0, cursorY = 40;
            u8g2Fonts.setFont(u8g2_font_logisoso24_tn);
            u8g2Fonts.setCursor(leftX, cursorY);
            u8g2Fonts.setForegroundColor(GxEPD_BLACK);
            u8g2Fonts.print(DataModels::lunar.gregoriandate.substring(0, 7));

            cursorY += 90;
            u8g2Fonts.setFont(u8g2_font_logisoso62_tn);
            u8g2Fonts.setCursor(leftX, cursorY);
            u8g2Fonts.setForegroundColor(GxEPD_RED);
            u8g2Fonts.print(DataModels::lunar.gregoriandate.substring(8, 10));
            u8g2Fonts.setForegroundColor(GxEPD_BLACK);

            // 天气 + 指数 + 未来12小时
            int wx = 140, wy = 30;
            u8g2Fonts.setFont(u8g2_font_wqy14_t_gb2312);
            u8g2Fonts.setCursor(wx, wy);
            u8g2Fonts.print(DataModels::weather.text);
            u8g2Fonts.setCursor(wx, wy + 20);
            u8g2Fonts.print("今天: " + DataModels::weather.tempToday);
            u8g2Fonts.setCursor(wx, wy + 40);
            u8g2Fonts.print("明天: " + DataModels::weather.tempTomorrow);

            int lMleftX = 20, lMleftY = 160;
            u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312);
            u8g2Fonts.setCursor(lMleftX, lMleftY);
            u8g2Fonts.setForegroundColor(GxEPD_BLACK);
            u8g2Fonts.print( DataModels::lunar.lmonthname);
            u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312);
            u8g2Fonts.setCursor(lMleftX, lMleftY+30);
            u8g2Fonts.setForegroundColor(GxEPD_BLACK);
            u8g2Fonts.print( DataModels::lunar.festival); 
            // 显示上次刷新时间（小时:分钟:秒） 
            // char timeStr[32];
            // struct tm *refresh_tm = localtime(&lastRefreshTime);
            // strftime(timeStr, sizeof(timeStr), "上次记录: %H:%M:%S", refresh_tm);
            // u8g2Fonts.setFont(u8g2_font_wqy14_t_gb2312);
            // u8g2Fonts.setCursor(280, 30);
            // u8g2Fonts.print(timeStr);

            int indexStartY = wy + 65;
            for (int i = 0; i < 3; i++)
            {
                u8g2Fonts.setForegroundColor(GxEPD_RED);
                u8g2Fonts.setFont(u8g2_font_wqy15_t_gb2312);
                int lines = drawWrappedText(u8g2Fonts, wx, indexStartY, DataModels::weather.tips[i], 54, 15);
                indexStartY += lines * 15 + 10;
            }
            u8g2Fonts.setForegroundColor(GxEPD_BLACK);

            // 未来12小时温度
            time_t now = time(nullptr);
            struct tm *now_tm = localtime(&now);
            int currentHour = now_tm->tm_hour;

            int startX = 0, startY = 210, stepX = 35;
            u8g2Fonts.setFont(u8g2_font_wqy12_t_gb2312);
            for (int i = 0; i < 12; i++)
            {
                int hour = (currentHour + i + 1) % 24;
                u8g2Fonts.setCursor(startX + stepX * i, startY);
                u8g2Fonts.print(String(hour) + "点");
                u8g2Fonts.setCursor(startX + stepX * i, startY + 18);
                u8g2Fonts.print(DataModels::weather.temperatureNextHours[i]);
            }

        } while (display.nextPage());
    }

}